package cn.im.qywx.wx.component.wakeon.util;

import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

/**
 * @Description:  UDP客户端程序，用于对服务端发送数据，并接收服务端的回应信息.
 * @version V1.0
 */
@Slf4j
public class UdpClientSocket {    
    private byte[] buffer = new byte[1024];    
    
    private DatagramSocket ds = null;    
    
    public static UdpClientSocket udpSocket = new UdpClientSocket();
    
    public static UdpClientSocket getInstance(){
    	return udpSocket;
    }
    /**  
     * 构造函数，创建UDP客户端  
     * @throws Exception  
     */    
    public UdpClientSocket(){    
        try {
			ds = new DatagramSocket();
		} catch (SocketException e) {
			log.info("UdpClientSocket cteate failed.");
			e.printStackTrace();
		}    
    }    
        
    /**  
     * 设置超时时间，该方法必须在bind方法之后使用.  
     * @param timeout 超时时间  
     * @throws Exception  
     */    
    public final void setSoTimeout(final int timeout) throws Exception {    
        ds.setSoTimeout(timeout);    
    }    
    
    /**  
     * 获得超时时间.  
     * @return 返回超时时间  
     * @throws Exception  
     */    
    public final int getSoTimeout() throws Exception {    
        return ds.getSoTimeout();    
    }    
    
    public final DatagramSocket getSocket() {    
        return ds;    
    }    
    
    /**  
     * 向指定的服务端发送数据信息.  
     * @param host 服务器主机地址  
     * @param port 服务端端口  
     * @param bytes 发送的数据信息  
     * @return 返回构造后俄数据报  
     * @throws IOException  
     */    
    public final DatagramPacket send(final String host, final int port,    
            final byte[] bytes) throws IOException {   
    	ds.setSoTimeout(3000);
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length, InetAddress.getByName(host), port);    
        ds.send(dp);    
        return dp;    
    }    
    
    /**  
     * 接收从指定的服务端发回的数据.  
     * @param lhost 服务端主机  
     * @param lport 服务端端口  
     * @return 返回从指定的服务端发回的数据.  
     * @throws Exception  
     */    
    public final String receive(final String lhost, final int lport)    
            throws Exception {    
        DatagramPacket dp = new DatagramPacket(buffer, buffer.length);    
        ds.receive(dp);    
        String info = new String(dp.getData(), 0, dp.getLength());    
        return info;    
    }    
    
    /**  
     * 关闭udp连接.  
     */    
    public final void close() {    
        try {    
            ds.close();    
        } catch (Exception ex) {    
            ex.printStackTrace();    
        }    
    }    
    
    /**  
     * 测试客户端发包和接收回应信息的方法.  
     * @param args  
     * @throws Exception  
     */    
    public static void main(String[] args) {    
    	
    	//wol-01 用户名 open  开机服务     wol-01 rockey open   （Yes, My lord.）

    	try {
			//wol-02 用户名	         查询办公电脑是否在线     （Up|Down）
			UdpClientSocket client = new UdpClientSocket();    
			String serverHost = "10.121.22.60";    
			int serverPort = 58000;    
			client.setSoTimeout(3000);
			DatagramPacket dp = client.send(serverHost, serverPort, ("wol-01 rockey open").getBytes());  
			String a = new String(dp.getData(), 0, dp.getLength());   
			log.info("发送数据：" + a);    
			String info = client.receive(serverHost, serverPort);    
			log.info("服务端回应数据：" + info);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}    
    }    
}   